package br.com.tcc.systemdx.domain;

import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;

import br.com.tcc.systemdx.domain.enumtypes.ProbabilidadeSimbolica;

@Entity
@Table(name = "sintoma")
public class Sintoma extends BaseEntityAssociated<Sintoma> {

	/**
	 * 
	 */
	private static final long serialVersionUID = -6291358593751508114L;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="doencaid", nullable=true, updatable = false)
	private DescricaoDoenca doenca;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="atributoid", nullable=false, updatable = true)
	private AtributoSintoma atributo;
	
	@ManyToOne(fetch = FetchType.EAGER)
	@JoinColumn(name="valorid", nullable=false, updatable = true)
	private ValorSintoma valor;
	
	@Enumerated(EnumType.ORDINAL)
	private ProbabilidadeSimbolica probabilidade;
	
	@OneToMany(mappedBy = "parent", cascade = { CascadeType.MERGE,
			CascadeType.PERSIST }, fetch = FetchType.EAGER)
	private List<Sintoma> elaboracao;

	public AtributoSintoma getAtributo() {
		return atributo;
	}

	public void setAtributo(AtributoSintoma atributo) {
		this.atributo = atributo;
	}

	public ValorSintoma getValor() {
		return valor;
	}

	public void setValor(ValorSintoma valor) {
		this.valor = valor;
	}

	public List<Sintoma> getElaboracao() {
		return elaboracao;
	}

	public void setElaboracao(List<Sintoma> elaboracao) {
		this.elaboracao = elaboracao;
	}
	
	public boolean isElaborado() {
		return (elaboracao != null && !elaboracao.isEmpty());
	}

	public void setProbabilidade(ProbabilidadeSimbolica probabilidade) {
		this.probabilidade = probabilidade;
	}

	public ProbabilidadeSimbolica getProbabilidade() {
		return probabilidade;
	}
	

	public DescricaoDoenca getDoenca() {
		return doenca;
	}

	public void setDoenca(DescricaoDoenca doenca) {
		this.doenca = doenca;
	}
	
	/**
	 * Compara dois sintomas pelos seus atributos.
	 * @param sintoma
	 * @return
	 */
	public boolean atributosIguais(Sintoma sintoma) {
		if (sintoma.getAtributo().equals(this.atributo) 
				&& sintoma.getValor().equals(this.valor)) {
			
			if (this.elaboracao == null && sintoma.getElaboracao() == null) {
				return true;
			} else if (this.elaboracao.size() == sintoma.elaboracao.size()) {
				int size = this.elaboracao.size();
				boolean elaboracoesIguais = true;
				for (int i = 0; i < size; i++) {
					Sintoma sintomaAux1 = this.elaboracao.get(i);
					Sintoma sintomaAux2 = sintoma.getElaboracao().get(i);
					if (!sintomaAux1.atributosIguais(sintomaAux2)) {
						elaboracoesIguais = false;
						break;
					}
				}
				return elaboracoesIguais;
			}
		}
		return false;
	}
	
	@Override
	public String toString() {
		if (this.atributo != null) {
			StringBuilder sb = new StringBuilder();
			sb.append(atributo.getTitulo());
			if (valor != null) {
				sb.append(" (");
				sb.append(valor.getTitulo());
				sb.append(")");
			}
			sb.append("<br/>");
			return sb.toString();
		}
		return super.toString();
	}
	

}
